/**
 *  迭代方法：传入第一个函数，系统会根据数组长度，依次调用函数，该函数通常有3个形式参数
 *    参数1：数组的项目（几乎必用）
 *    参数2：项目的索引（较少情况用到）
 *    参数3：数组本身的引用（几乎用不到）
 *  高阶函数：如果函数a的形式参数是一个函数，那么函数a就是高阶函数
 *  消灭for循环：利用箭头函数+迭代方法，可以减少代码量，尽可能地少用for循环
 * */ 

let a = [1,2,3,4];

// forEach：普通的遍历
a.forEach((v,i) => console.log(i,"=",v));

// filter：创建新的数组，由通过函数测试的成员组成
// map：创建新的数组，由通过函数加工的成员组成

// 大于2的成员构成的新数组
let newArr = a.filter(v => v > 2);
console.log("newArr =",newArr); // [ 3, 4 ]
// 由成员乘以2构成新的数组
newArr = a.map(v => v *2);
console.log("newArr =",newArr); // [ 2, 4, 6, 8 ]

// reduce：从左往右累加，执行函数的次数为数组长度-1。
// reduceRight：作用同reduce一样，不过是从右往左计算。
// 有四个参数：第一个参数为当前累计值（第一次，默认以开始的元素作为当前累计值）
let result = a.reduce((r,v,i,arr) => {
    console.log(`i = ${i},v = ${v},r = ${r}`);
    return r + v;
});
console.log("result =",result);

// some: 判断数组中是不是有成员通过了函数的测试
// every: 判断数组中是不是所有成员通过了函数的测试
// 判断数组中的成员，有没有大于4的
result = a.some(v => v > 4);
console.log("result =",result); // false
// 判断数组中的成员，是不是全部大于4
result = a.every(v => v > 4);
console.log("result =",result); // false

// findIndex: 返回第一个通过函数测试的索引
// find: : 返回第一个通过函数测试的项目
// 返回第一个值大于2的索引
result = a.findIndex(v => v > 2);
console.log("result =",result); // 2
// 返回第一个值大于2的值
result = a.find(v => v > 2); 
console.log("result =",result); // 3

// 当时顺便讲的两个不是迭代方法（也非高阶函数）的函数：
// indexOf：查找第一个相等的成员的索引，如果没有查到返回-1。
// lastIndexOf：查找最后一个相等的成员的索引，如果没有查到返回-1。
result = a.indexOf(2);
console.log("result =",result); // 1
result = a.lastIndexOf(2);
console.log("result =",result); // 1